// 导入 Sequelize 的数据类型模块，用于定义模型字段类型
const { DataTypes } = require("sequelize");
// 导入数据库连接实例（已配置好的 Sequelize 连接）
const sequelize = require("../config/db");

// 定义 AlarmRecord 模型（对应数据库中的 alarm_record 表）
const AlarmRecord = sequelize.define(
  "AlarmRecord", // Sequelize 内部模型名（大写开头,约定俗成）
  {
    alarmRecordId: {
      type: DataTypes.INTEGER, // 整数类型
      primaryKey: true, // 设为主键
      autoIncrement: true, // 自动递增
      allowNull: false, // 非空
      field: "alarm_record_id", // 映射数据库中的字段名(下划线命名)
      comment: "报警记录编号，主键", // 字段注释
    },
    userId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      field: "user_id",
      comment: "关联的用户ID",
    },
    equipmentId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      field: "equipment_id",
      comment: "关联的设备 ID",
    },
    gaugingPointId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      field: "gauging_point_id",
      comment: "关联的测点 ID",
    },
    operatingConditionId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      field: "operating_condition_id",
      comment: "关联的工况 ID",
    },
    sensorId: {
      type: DataTypes.STRING(50), // 字符串类型，最大长度 50
      allowNull: false,
      field: "sensor_id",
      comment: "传感器编号",
    },
    sensorVersionNumber: {
      type: DataTypes.STRING(50),
      allowNull: false,
      field: "sensor_version_number",
      comment: "传感器版本号",
    },
    recordId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      field: "record_id",
      comment: "关联的采集记录 ID",
    },
    collectedTime: {
      type: DataTypes.DATE, // 日期时间类型
      allowNull: false,
      field: "collected_time",
      comment: "报警触发时间",
    },
    targetId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      field: "target_id",
      comment: "关联的指标 ID",
    },
    name: {
      type: DataTypes.STRING(100), // 字符串类型，最大长度 100
      allowNull: false,
      comment: "报警指标名称",
    },
    code: {
      type: DataTypes.STRING(50), // 字符串类型，最大长度 50
      allowNull: false,
      comment: "报警指标简称",
    },
    unit: {
      type: DataTypes.STRING(20), // 字符串类型，最大长度 20
      allowNull: false,
      comment: "报警指标单位",
    },
    value: {
      type: DataTypes.DECIMAL(10, 2), // 十进制数值类型，最多 10 位，其中小数点后 2 位
      allowNull: false,
      comment: "报警指标值",
    },
    leastValue: {
      type: DataTypes.DECIMAL(10, 2),
      allowNull: false,
      field: "least_value",
      comment: "指标最小值",
    },
    one: {
      type: DataTypes.DECIMAL(10, 2),
      allowNull: false,
      comment: "一级报警值",
    },
    two: {
      type: DataTypes.DECIMAL(10, 2),
      allowNull: false,
      comment: "二级报警值",
    },
    three: {
      type: DataTypes.DECIMAL(10, 2),
      allowNull: false,
      comment: "三级报警值",
    },
    healthStatus: {
      type: DataTypes.TINYINT, // tinyint 类型（1字节整数，范围-128~127）
      allowNull: false,
      field: "health_status",
      comment: "报警级别（1：一级报警，2：二级报警，3：三级报警）",
    },
    processingContent: {
      type: DataTypes.STRING(500), // 字符串类型，最大长度 500
      allowNull: true, // 可空
      field: "processing_content",
      comment: "报警处理内容",
    },
    processingStatus: {
      type: DataTypes.TINYINT,
      allowNull: false,
      defaultValue: 0,
      field: "processing_status",
      comment: "报警处理状态（0：未处理，1：已处理）",
    },
    processingUserId: {
      type: DataTypes.INTEGER,
      allowNull: true,
      field: "processing_user_id",
      comment: "处理人 ID",
    },
    processingTime: {
      type: DataTypes.DATE, // 日期时间类型
      allowNull: true,
      field: "processing_time",
      comment: "处理时间",
    },
  },
  {
    tableName: "alarm_record", // 显式指定数据库表名（小写,与表名一致）
    freezeTableName: true, // 禁止 Sequelize 自动将表名复数化
    timestamps: false, // 不自动生成 createdAt 和 updatedAt 字段
    comment: "报警记录表",
    // 定义表索引(优化查询性能)
    indexes: [
      {
        fields: ["collected_time"], // 单字段索引
        name: "idx_alarm_collected_time", // idx_前缀表示普通索引
        // 用途：优化按时间查询报警记录（如查询今日报警）
      },
      {
        fields: ["health_status"],
        name: "idx_alarm_health_status",
        // 用途：优化按报警级别筛选（如查询所有三级报警）
      },
      {
        fields: ["processing_status"],
        name: "idx_alarm_processing_status",
        // 用途：优化查询未处理报警
      },
      {
        fields: ["equipment_id"],
        name: "fk_alarm_equipment_id",
        // 用途：优化按设备查询报警记录
      },
      {
        fields: ["gauging_point_id"],
        name: "fk_alarm_gauging_point_id",
        // 用途：优化按测点查询报警记录
      },
      {
        fields: ["operating_condition_id"],
        name: "fk_alarm_operating_condition_id",
        // 用途：优化按工况查询报警记录
      },
      {
        fields: ["record_id"],
        name: "fk_alarm_record_id",
        // 用途：优化按采集记录查询关联报警
      },
      {
        fields: ["target_id"],
        name: "fk_alarm_target_id",
        // 用途：优化按指标查询关联报警
      },
      {
        fields: ["processing_user_id"],
        name: "fk_alarm_processing_user_id",
        // 用途：优化按处理人查询报警记录
      },
      {
        fields: ["user_id"],
        name: "fk_alarm_user_id",
        // 用途：优化按用户查询报警记录
      },
    ],
  }
);

// 导出模型供其他模块使用
module.exports = AlarmRecord;
